package metier.outils;

import java.awt.Color;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.LinkedList;
import java.util.List;
import java.util.StringTokenizer;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.Namespace;
import org.jdom.input.SAXBuilder;

import metier.modele.Constantes;
import metier.modele.Figure;
import metier.modele.Utilisateur;

public class ImportSVG {

	private File svgFile;
	private LinkedList<Figure> lFigure;
	
	private static Element element;
	private static Namespace nsPerso = Namespace.getNamespace("ex",Constantes.NS_PERSO);
	
	public ImportSVG(File svgFile, LinkedList<Figure> lFigure)
	{
		this.svgFile = svgFile;
		this.lFigure = lFigure;
	}
	
	
	@SuppressWarnings("unchecked")
	/**
	 * Constructeur
	 * Charge un fichier SVG et alimente une liste de 'Figure'
	 */
	public void SVGToGraphic() throws JDOMException
	{
		Document doc=new Document();

		SAXBuilder builder = new SAXBuilder();
		try {
			// Lecture du document XML et génération d'un document JDOM
			doc = builder.build(new FileInputStream(svgFile));
		}
		catch (IOException e2) {
			e2.getStackTrace();
		}
		
		element=doc.getRootElement();
		
		List<Element> formes= (List<Element>)element.getChildren();

		for(Element iter:formes){
			if(iter.getName().equals("ellipse")){
				lFigure.add(getEllipse(iter));
			}
			else if(iter.getName().equals("polyline")){
				lFigure.add(getMain(iter));
			}
			else if(iter.getName().equals("line")){
				lFigure.add(getTrait(iter));
			}
			else if(iter.getName().equals("rect")){
				lFigure.add(getRect(iter));
			}
		}
	}
	
	
	public static Tools_Ellipse getEllipse(Element ellipse){
		Tools_Ellipse retour=new Tools_Ellipse();

		int cx=Integer.parseInt(ellipse.getAttributeValue("cx"));
		int cy=Integer.parseInt(ellipse.getAttributeValue("cy"));
		int rx=Integer.parseInt(ellipse.getAttributeValue("rx"));
		int ry=Integer.parseInt(ellipse.getAttributeValue("ry"));

		Color bg=Color.decode("0x"+ellipse.getAttributeValue("fill").substring(1));
		Color fg=Color.decode("0x"+ellipse.getAttributeValue("stroke").substring(1));
		
		Utilisateur owner = new Utilisateur(ellipse.getAttributeValue("owner", nsPerso),
				-1,
				Utilisateur.AJOUT,
				Color.BLACK);

		retour.setCouleurs(fg, bg);
		retour.setX1(cx-rx);
		retour.setY1(cy-ry);
		retour.setX2(cx+rx);
		retour.setY2(cy+ry);
		retour.setOwner(owner);

		return retour;
	}

	public static Tools_Rect getRect(Element rect){
		Tools_Rect retour=new Tools_Rect();

		int x=Integer.parseInt(rect.getAttributeValue("x"));
		int y=Integer.parseInt(rect.getAttributeValue("y"));
		int width=Integer.parseInt(rect.getAttributeValue("width"));
		int height=Integer.parseInt(rect.getAttributeValue("height"));

		Color bg=Color.decode("0x"+rect.getAttributeValue("fill").substring(1));
		Color fg=Color.decode("0x"+rect.getAttributeValue("stroke").substring(1));
		
		Utilisateur owner = new Utilisateur(rect.getAttributeValue("owner", nsPerso),
				-1,
				Utilisateur.AJOUT,
				Color.BLACK);
		
		retour.setCouleurs(fg, bg);
		retour.setX1(x);
		retour.setY1(y);
		retour.setX2(x+width);
		retour.setY2(y+height);
		retour.setOwner(owner);

		return retour;
	}

	public static Tools_Trait getTrait(Element trait){
		Tools_Trait retour=new Tools_Trait();

		retour.setX1(Integer.parseInt(trait.getAttributeValue("x1")));
		retour.setY1(Integer.parseInt(trait.getAttributeValue("y1")));
		retour.setX2(Integer.parseInt(trait.getAttributeValue("x2")));
		retour.setY2(Integer.parseInt(trait.getAttributeValue("y2")));

		Color fg=Color.decode("0x"+trait.getAttributeValue("stroke").substring(1));

		Utilisateur owner = new Utilisateur(trait.getAttributeValue("owner", nsPerso),
				-1,
				Utilisateur.AJOUT,
				Color.BLACK);
		
		retour.setCouleurs(fg, null);
		retour.setOwner(owner);

		return retour;
	}

	public static Tools_Main getMain(Element main){
		Tools_Main retour=new Tools_Main();

		Color fg=Color.decode("0x"+main.getAttributeValue("stroke").substring(1));
		retour.setCouleurs(fg, null);

		String lesPoints=main.getAttributeValue("points");
		StringTokenizer token1=new StringTokenizer(lesPoints, " ");
		while(token1.hasMoreElements()){
			StringTokenizer token2=new StringTokenizer(token1.nextToken(), ",");
			if(token2.countTokens()<2){
				System.err.println("Erreur de lecture du fichier svg");
			}else{
				int x=Integer.parseInt(token2.nextToken());
				int y=Integer.parseInt(token2.nextToken());
				retour.setDonnees(0, 0, x, y);
			}
		}
		
		Utilisateur owner = new Utilisateur(main.getAttributeValue("owner", nsPerso),
				-1,
				Utilisateur.AJOUT,
				Color.BLACK);
		
		retour.setOwner(owner);

		return retour;
	}
	
	
}
